package com.bdqn.t382.sz.test;

import com.bdqn.t382.sz.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;

public class Sz2 {
    public static void main(String[] args) {
        try {
            // 获取 Person 类的 Class 对象
            Class<?> personClass = Person.class;
            // 方式一：使用 Class.newInstance() 创建实例（仅适用于无参构造方法）
            // Person person1 = (Person) personClass.newInstance();
            // 方式二：使用 Constructor 创建实例（可用于有参构造方法）
            Constructor<?> constructor = personClass.getConstructor(String.class, int.class, Date.class);
            Date birthDate = new Date();
            Person person = (Person) constructor.newInstance("John", 30, birthDate);
            // 通过反射获取属性并进行赋值和取值操作
            // 获取 name 属性
            Field nameField = personClass.getDeclaredField("name");
            // 禁止 Java 语言访问检查，以便访问私有属性
            nameField.setAccessible(true);
            // 赋值操作
            nameField.set(person, "Alice");
            // 取值操作
            String name = (String) nameField.get(person);
            System.out.println("Name: " + name);
            // 获取 age 属性
            Field ageField = personClass.getDeclaredField("age");
            ageField.setAccessible(true);
            // 赋值操作
            ageField.set(person, 25);
            // 取值操作
            int age = ageField.getInt(person);
            System.out.println("Age: " + age);
            // 获取 birthDate 属性
            Field birthDateField = personClass.getDeclaredField("birthDate");
            birthDateField.setAccessible(true);
            // 赋值操作
            birthDateField.set(person, new Date());
            // 取值操作
            Date newBirthDate = (Date) birthDateField.get(person);
            System.out.println("Birth Date: " + newBirthDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
